﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/*
* University of Reykjavík
* Brjóstagjöf.is is the product of first-year practical programming course
* for computer science students at said university
*
* URL: http://code.google.com/p/scags 
* Authors: 
* Ástvaldur Sigurðsson
* Guðjón Jónsson
* Kristín Inga Vigfúsdóttir
* Steinar Bragi Sigurðsson
* Sveinn Ernstsson
*/

namespace skags.Models
{
    /* Samskipti við töflur News og NewsCategory og aspnet_user i tilviki (db) af taginu DBDataContext */  
    public class NewsRepository
    {
        /* tilvik af gagnagrunni (vísun/tenging í gagnagrunn) búin til */
        DBDataContext dc = new DBDataContext();

        /* Vistar breytingar á tilviki */
        public void Save()
        {
            dc.SubmitChanges();
        }

        /*
         * Uppfaerir lestur teljara fyrir newsItem
         * Notað af NewsController
         */ 
        public void UpdateReadCount(New newsItem)
        {
            if (newsItem.ReadCount != null)
            {
                newsItem.ReadCount += 1;
            }
            else
            {
                newsItem.ReadCount = 1;
            }
            Save();
        }

        /*
         * Allar frettir i öllum flokkum sóttar i db og stungið i nafnlaust tilvik af NewsTableViewModel
         * Notað af NewsController.
         */
        public NewsTablesViewModel GetAll(int limit)
        {
            var allNews = (from s in dc.News
                         orderby s.ID descending
                         select s).Take(limit);

            // Köllum á fall sem sér um að skera meginmál fréttanna niður
            foreach (var s in allNews)
                s.Text = DBRepository.LimitWords(s.Text, "/News/ViewItem/" + s.ID);

            var allCategories = from s in dc.NewsCategories
                         orderby s.Title ascending
                         select s;

            return new NewsTablesViewModel { News = allNews, Categories = allCategories };
        }
       
         /* fyrirspurn i töflur News, NewsCategory og aspnet_User i db.
         * tengdar saman a ID og raðað í lækkandi röð
         * Skilað sem IENumerable safni af NewsViewModel tilvikum 
         * Notað af AdminController.  
         */
        public IEnumerable<NewsViewModel> GetAllNews()
        {
            // linq fyrirspurn - gögnum stungið í 
            var result = from n in dc.News
                         join c in dc.NewsCategories on n.CategoryID equals c.ID
                         join u in dc.aspnet_Users on n.CreatorID equals u.UserId
                         orderby n.ID descending
                         select new NewsViewModel
                         { 
                             ID = n.ID,
                             Title = n.Title,
                             CreatorID = n.CreatorID,
                             CreatorName = u.UserName,
                             DateCreated = n.DateCreated,
                             Text = n.Text,
                             ReadCount = n.ReadCount,
                             Tags = n.Tags,
                             CategoryID = n.CategoryID,
                             CategoryName = c.Title
                         };

            return result;
        }

        /*
         * Saekir alla fréttaflokka.
         * Notað af AdminController.
         */ 
        public IEnumerable<NewsCategory> GetAllCategories()
        {
            var result = from s in dc.NewsCategories
                         orderby s.ID descending
                         select s;

            return result;
        }

        /*
         * Saekir fréttir eftir flokkanúmerum.
         * Notað af NewsController.
         */ 
        public NewsTablesViewModel GetNewsByCategoryID(int id)
        {
            var allCategories = from s in dc.NewsCategories
                                orderby s.Title ascending
                                select s;

            var allNews = from s in dc.News
                          where s.CategoryID == id
                          orderby s.ID descending
                          select s;

            // Köllum á fall sem sér um að skera meginmál fréttanna niður
            foreach (var s in allNews)
                s.Text = DBRepository.LimitWords(s.Text, "/Article/ViewItem/" + s.ID);

            return new NewsTablesViewModel { News = allNews, Categories = allCategories };
        }

        /*
         * Saekir fréttir eftir numeri.
         * Notað af NewsController.
         */ 
        public New GetNewsByID(int id)
        {
            return dc.News.SingleOrDefault(u => u.ID == id);
        }

        /*
         * Saekir fréttir eftir flokknúmeri.
         * Notað af AdminController.
         */ 
        public NewsCatViewModel GetNewsCatByID(int id)
        {
            var theNews = dc.News.SingleOrDefault(u => u.ID == id);
            var allCategories = GetAllCategories();

            return new NewsCatViewModel
            {
                ID = theNews.ID,
                Title = theNews.Title,
                CreatorID = theNews.CreatorID,
                DateCreated = theNews.DateCreated,
                Text = theNews.Text,
                ReadCount = theNews.ReadCount,
                Tags = theNews.Tags,
                CategoryID = theNews.CategoryID,
                Categories = allCategories
            };
        }

        /*
         * Saekir fréttir eftir flokknúmeri
         * Notað af AdminController.
         */ 
        public NewsCategory GetNewsCategoryByID(int id)
        {
            return (from s in dc.NewsCategories
                    where s.ID == id
                    select s).SingleOrDefault();
        }

        /* 
         * Uppfærir frétt.
         * Notað af AdminController.
         */ 
        public void UpdateNews(New item)
        {
            var theNews = GetNewsByID(item.ID);
            if (theNews != null)
            {
                theNews.CategoryID = item.CategoryID;
                theNews.ReadCount = item.ReadCount;
                theNews.Tags = item.Tags;
                theNews.Text = item.Text;
                theNews.Title = item.Title;

                Save();
            }
        }

        /* 
         * Uppfærir fréttaflokk.
         * Notað af AdminController.
         */ 
        public void UpdateNewsCategory(NewsCategory item)
        {
            var theCat = GetNewsCategoryByID(item.ID);
            if (theCat != null)
            {
                theCat.Title = item.Title;
            }

            Save();
        }

        /* 
         * Búa til frétt.
         * Notað af AdminController.
         */ 
        public void AddNews(New item)
        {
            dc.News.InsertOnSubmit(item);
            Save();
            EmailLogMedia mailman = new EmailLogMedia();
            mailman.SendSubscriptionUpdate();
        }

        /* 
        * Búa til fréttaflokk.
        * Notað af AdminController.
        */
        public void AddNewsCategory(NewsCategory item)
        {
            dc.NewsCategories.InsertOnSubmit(item);
            Save();
        }

        /* 
        * Eyða frétt.
        * Notað af AdminController.
        */ 
        public void DeleteNews(int id)
        {
            var itemToDelete = GetNewsByID(id);

            if( itemToDelete == null )
                throw new Exception("Þessi frétt sem þú reynir að eyða er ekki til!");

            dc.News.DeleteOnSubmit(itemToDelete);

            Save();
        }

        /* 
        * Eyða fréttaflokk og öllum hans fréttum.
        * Notað af AdminController.
        */ 
        public void DeleteNewsCategory(int id)
        {
            // Finnum allar fréttir í þessum flokk
            var newsToDelete = from s in dc.News
                               where s.CategoryID == id
                               select s;
            // Finnum færsluna í gagnagrunninum
            var catToDelete = GetNewsCategoryByID(id);

            dc.News.DeleteAllOnSubmit(newsToDelete);
            dc.NewsCategories.DeleteOnSubmit(catToDelete);

            Save();
        }

        public IEnumerable<NewsViewModel> GetNewestByAmount(int id)
        {
            UserRepository urep = new UserRepository();

            return  (from n in dc.News
                        orderby n.DateCreated descending
                        select new NewsViewModel
                                   {
                                       ID = n.ID,
                                       CategoryID = n.CategoryID,
                                       CategoryName = n.NewsCategory.Title,
                                       CreatorID = n.CreatorID,
                                       CreatorName = urep.GetNameByHashID(n.CreatorID),
                                       DateCreated = n.DateCreated,
                                       ReadCount = n.ReadCount,
                                       Tags = n.Tags,
                                       Text = n.Text,
                                       Title = n.Title,

                                   }).Take(id);
        }
        public IEnumerable<NewsViewModel> GetMostReadByAmount(int amount)
        {
            UserRepository urep = new UserRepository();

            return (from n in dc.News
                    orderby n.ReadCount descending
                    select new NewsViewModel
                    {
                        ID = n.ID,
                        CategoryID = n.CategoryID,
                        CategoryName = n.NewsCategory.Title,
                        CreatorID = n.CreatorID,
                        CreatorName = urep.GetNameByHashID(n.CreatorID),
                        DateCreated = n.DateCreated,
                        ReadCount = n.ReadCount,
                        Tags = n.Tags,
                        Text = n.Text,
                        Title = n.Title,

                    }).Take(amount);
        }
    }
}